const Koa = require('koa')
const KoaRouter = require('@koa/router')
// 解析 body 参数、urlencoded参数中间件
const koaBodyParser = require('koa-bodyparser')
// 解析 from-data参数、例如图片、视频、音频、文档
const multer = require('@koa/multer')

// 创建实例
const app = new Koa()
const route = new KoaRouter({ prefix: '/user' }) // 配置路径前缀
// route.prefix('/user')
// 启动服务、路由中间件挂载app
app.use(route.routes()).listen(8000, () => console.log('ok'))


/**
 * koa 请求参数解析
 *      get：  /user/:id     动态路由、params方式
 *      get：  /user?id=1    query方式
 *      post   {Id:1}        json方式
 *      post   urlencoded    二进制码
 *      post   form-data     文件文件格式：图片、
 */

/**
 * 1、params 动态路由
 *      请求路径：http://127.0.0.1:8000/user/findById/1234567
 */
route.get('/findById/:id', (ctx, next) => {
    // 获取参数
    console.log(ctx.params.id);

    // 响应数据
    ctx.body = {
        code: 200,
        message: ctx.params.id
    }
})




/**
 * 2、query 请求方式
 *      请求路径：http://127.0.0.1:8000/user/findByName?name=张三&age=20
 */
route.get('/findByName', (ctx, next) => {
    // 获取参数
    console.log(ctx.query);
    // 响应数据
    ctx.body = ctx.query
})




/**
 * 3、body / json请求方式
 *      请求路径：http://127.0.0.1:8000/user/findAll
 *      请求参数：{ "name":"JSON请求","username":"admin","password":"123456"}
 * 
 *    对于 body 请求中的json数据、我们需要用到第三方库 koa-bodparser 进行解析
 *      1、安装：npm install koa-bodparser
 *      2、导入：const koaBodyParser = require()
 *      3、注册解析中间件 app.use(koaBodyParser)
 */
app.use(koaBodyParser())
route.post('/findAll', (ctx, next) => {
    // 获取参数、使用 koa-bodparser 解析后，请求数据会放在 request.body内
    console.log(ctx.request.body);

    // 响应数据
    ctx.body = ctx.request.body
})




/**
 * 4、body / urlencoded 请求方式
 *      请求路径：http://127.0.0.1:8000/user/urlencoded
 *      请求参数：{ "name":"urlencoded请求"}
 *      也是通过 app.use(koaBodyParser()) 进行解析
 */
route.post('/urlencoded', (ctx, next) => {
    // 获取参数、使用 koa-bodparser 解析后，请求数据会放在 request.body内
    console.log(ctx.request.body);

    // 响应数据
    ctx.body = ctx.request.body
})




/**
 * 5、body / from-data 请求方式
 *      请求路径：http://127.0.0.1:8000/user/fromdata
 *      请求参数：{ "name":"fromdata 请求"}
 * 
 *    对于 body 请求中的 from-data 数据、我们需要用到第三方库 multer 进行解析
 *      1、安装：npm install @koa/multer multer
 *      2、导入：const koaBodyParser = require()
 *      3、注册解析中间件 app.use(koaBodyParser)
 */
const KoaMulter = multer()
// KoaMulter.any()：任意文件解析、
route.post('/fromdata', KoaMulter.any(), (ctx, next) => {
    // 获取参数
    console.log(ctx.request.body);

    // 响应数据
    ctx.body = ctx.request.body
})




/**
 * 6、body / from-data 单文件上传
 *      请求路径：http://127.0.0.1:8000/user/imgFile
 *      请求参数：{ "img":"图片文件"}
 *      也是通过 multer 进行解析    
 */
// 配置相关参数
const upload = multer({
    // dest:'./static/img' // 上传后文件保存位置、可以自动创建文件夹
    // 自定义文件名称
    storage: multer.diskStorage({
        // 定义上传后文件的存放位置
        destination(req, file, cb) {
            console.log(req, file, cb);
            cb(null, __dirname + '/image')
        },
        // 定义文件名称
        filename(req, file, cb) {
            console.log(req, file, cb);
            cb(null, Date.now() + '_' + file.originalname)
        }
    })
})
// upload.single('参数key')：单文件上传、例如：图片、文档、视频、音频等、
route.post('/imgFile', upload.single('img'), (ctx, next) => {
    // 获取参数
    console.log(ctx.request.file);

    // 响应数据
    ctx.body = '图片上传成功~'
})




/**
 * 6、body / from-data 多文件上传
 *      请求路径：http://127.0.0.1:8000/user/fileArray
 *      请求参数：{ "file":[]}
 *      也是通过 multer 进行解析    
 */
// upload.array('参数key')：多文件上传、例如：图片、文档、视频、音频等、
route.post('/fileArray', upload.array('files'), (ctx, next) => {
    // 获取参数
    console.log(ctx.request.files);

    // 响应数据
    ctx.body = '文件上传成功~'
})


